package com.shujia

object Demo04CaseClass {
  def main(args: Array[String]): Unit = {
    val caseClzJava: CaseClzJava = new CaseClzJava("01", "张三Java", 20)
    caseClzJava.setId("02")
    println(caseClzJava.getId)
    println(caseClzJava)

    val caseClzScala: CaseClzScala = new CaseClzScala("02", "张三Scala", 22)
    caseClzScala.setId("03")
    println(caseClzScala.getId())
    println(caseClzScala)

    /**
     * 使用样例类对象时可以不用new关键字创建
     */
    val caseClz: CaseClz = new CaseClz("03", "张三Case Class", 23)
    caseClz.id = "04"
    println(caseClz.id)
    println(caseClz)

    val caseClz2: CaseClz =  CaseClz("04", "张三Case Class", 24)
    caseClz2.id = "05"
    println(caseClz2.id)
    println(caseClz2)


  }
}

/**
 * 定义一个CaseClz类 对定义的属性都需要配套get set方法
 */
// 使用一般的方式进行定义
class CaseClzScala(id:String,name:String,age:Int){
  var _id:String = id

  def getId():String = {
    return this._id
  }

  def setId(id:String):Unit = {
    this._id = id
  }


  override def toString = s"CaseClzScala(${_id})"
}

// 使用更快捷的方式：通过样例类实现

/**
 * 1、默认会对所有属性实现get方法，如果需要set方法则要使用var进行修饰
 * 2、默认对所有的属性都是由val修饰的，不能重新赋值
 * 3、默认实现了序列化接口，可以进行网络的传输
 * 4、默认实现了apply方法，所以不需要使用new关键字进行创建
 * 5、默认会重写toString方法 打印时会将所有的属性打印出来
 */
case class CaseClz(var id:String,var name:String,age:Int)